// 应用安装管理模块

/**
 * 安装管理器配置
 */
const config = {
  installButtonId: 'installButton',
  instructionsId: 'instructions',
  manualInstructionsId: 'manualInstructions',
};

/**
 * 存储安装事件的引用
 */
let deferredPrompt = null;

/**
 * 初始化应用安装功能
 */
export function initAppInstallation() {
  // 检查是否已从桌面启动
  checkIfStandalone();

  // 设置安装事件监听
  setupInstallEventListeners();
}

/**
 * 设置安装事件监听器
 */
function setupInstallEventListeners() {
  // 监听安装提示事件
  window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt);

  // 监听应用安装成功事件
  window.addEventListener('appinstalled', handleAppInstalled);

  // 为安装按钮添加点击事件
  const installButton = getInstallButton();
  if (installButton) {
    installButton.addEventListener('click', handleInstallButtonClick);
  }
}

/**
 * 处理安装提示事件
 */
function handleBeforeInstallPrompt(e) {
  // 阻止默认的安装提示显示
  e.preventDefault();

  // 保存事件引用以便稍后使用
  deferredPrompt = e;

  // 启用安装按钮
  const installButton = getInstallButton();
  const instructions = getInstructionsElement();

  if (installButton) {
    installButton.disabled = false;
  }

  if (instructions) {
    instructions.style.display = 'none';
  }

  console.log('安装提示已保存，等待用户操作');
}

/**
 * 处理安装按钮点击
 */
async function handleInstallButtonClick() {
  if (!deferredPrompt) {
    console.warn('没有可用的安装提示事件');
    return;
  }

  // 显示安装提示
  deferredPrompt.prompt();

  // 等待用户选择
  const { outcome } = await deferredPrompt.userChoice;
  console.log(`用户选择: ${outcome}`);

  // 重置安装提示引用
  deferredPrompt = null;

  // 更新UI状态
  updateUIAfterInstallation(outcome);
}

/**
 * 处理应用安装成功事件
 */
function handleAppInstalled() {
  console.log('应用已安装到桌面');

  // 更新UI状态
  updateUIAfterInstallation('accepted');
}

/**
 * 安装后更新UI
 */
function updateUIAfterInstallation(outcome) {
  const installButton = getInstallButton();
  const instructions = getInstructionsElement();

  if (installButton) {
    installButton.disabled = true;
    installButton.textContent = outcome === 'accepted' ? '已添加到桌面' : '安装已取消';
  }

  if (instructions) {
    // 延迟显示指令，让用户看到按钮状态变化
    setTimeout(() => {
      instructions.style.display = 'block';

      if (outcome === 'accepted') {
        instructions.innerHTML = '<p>感谢您的安装！</p>';
      } else {
        // 保持原有手动安装说明
        instructions.innerHTML = `<p>如果没有看到按钮，请手动添加：</p><p id="${config.manualInstructionsId}">iOS: 点击分享按钮 → 添加到主屏幕<br>Android: 点击菜单 → 添加到主屏幕</p>`;
      }
    }, 1000);
  }
}

/**
 * 检查应用是否以独立模式运行（从桌面启动）
 */
function checkIfStandalone() {
  // 检查display-mode媒体查询
  if (window.matchMedia('(display-mode: standalone)').matches) {
    console.log('应用从桌面启动');

    // 更新UI状态
    const installButton = getInstallButton();
    const instructions = getInstructionsElement();

    if (installButton) {
      installButton.style.display = 'none';
    }

    if (instructions) {
      instructions.innerHTML = '<p>应用已从桌面启动</p>';
    }
  }
}

/**
 * 获取安装按钮元素
 */
function getInstallButton() {
  return document.getElementById(config.installButtonId);
}

/**
 * 获取说明元素
 */
function getInstructionsElement() {
  return document.getElementById(config.instructionsId);
}

/**
 * 获取当前的安装提示事件
 */
export function getDeferredPrompt() {
  return deferredPrompt;
}

/**
 * 手动触发安装流程（如果可用）
 */
export async function triggerInstallation() {
  if (!deferredPrompt) {
    console.warn('没有可用的安装提示事件');
    return Promise.reject(new Error('没有可用的安装提示事件'));
  }

  return handleInstallButtonClick();
}
